package look4ss.aplicativo;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import com.sdsmdg.tastytoast.TastyToast;
import com.squareup.picasso.Picasso;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.util.UUID;
import im.delight.android.location.SimpleLocation;

public class ActivityEnviar extends AppCompatActivity {
    StorageReference referenceStorage;
    private static final int ESCOLHER_IMAGEM_REQUESTCODE = 2;
    ProgressDialog dialogoLoading;
    public Context context;
    private SimpleLocation localizacao;
    public String extensaoArquivo;
    public String latitude;
    private SharedPreferences sharp;
    public String longitude;
    public Double latitudeDouble;
    public Double longitudeDouble;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        sharp = getSharedPreferences("loginPrefs", MODE_PRIVATE);

        if(sharp.getString("uid", "").equals("") || sharp.getString("nome", "").equals("")){
            // TastyToast.makeText(getApplicationContext(), getString("teste: erro, não foi possível continuar"), Toast.LENGTH_SHORT, TastyToast.ERROR);
            //finalizar();
            startActivity(new Intent(ActivityEnviar.this, posLogin.class));
        }

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_enviar);

        localizacao = new SimpleLocation(this, true, false, 100000, true);
        dialogoLoading = new ProgressDialog(this);
        referenceStorage = FirebaseStorage.getInstance().getReference();

        dialogoLoading.setMessage(getString(R.string.obtendo_coordenadas_pode_demorar));
        dialogoLoading.setCancelable(false);
        dialogoLoading.show();

        localizacao.beginUpdates();
        localizacao.setListener(new SimpleLocation.Listener() {
            @Override
            public void onPositionChanged() {
                try {
                    latitudeDouble = localizacao.getLatitude();
                    longitudeDouble = localizacao.getLongitude();
                    dialogoLoading.dismiss();
                    localizacao.endUpdates();
                    if(latitudeDouble == 0.0 || latitudeDouble == null) {
                        erroLocalizacaoNula();
                    }
                } catch (IllegalArgumentException iae) {
                    //
                }
            }
        });
    }
    public void escolherImagem(View view) {
        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setType("image/* video/*");
        startActivityForResult(intent, ESCOLHER_IMAGEM_REQUESTCODE);
    }

    @Override
    protected void onActivityResult(int codigoRequest, int codigoResultado, Intent data) {
        super.onActivityResult(codigoRequest, codigoResultado, data);
        dialogoLoading.setMessage(getString(R.string.enviando));
        dialogoLoading.setCancelable(false);
        dialogoLoading.show();

        final Uri arquivoLocalImagem = data.getData();
        ContentResolver cntrslvr = this.getContentResolver();
        final String tipoArquivo = cntrslvr.getType(arquivoLocalImagem);
        ImageView imagem_enviar = findViewById(R.id.imagem_enviar);
        //FirebaseUser usuarioAtual = FirebaseAuth.getInstance().getCurrentUser();
        Picasso.get().load(arquivoLocalImagem).placeholder(R.drawable.ic_mr_button_grey).into(imagem_enviar);

        if("image/png".equals(tipoArquivo)) {
            extensaoArquivo = ".png";
        }
        if("image/jpeg".equals(tipoArquivo)) {
            extensaoArquivo = ".jpg";
        }
        if("video/mp4".equals(tipoArquivo)) {
            extensaoArquivo = ".mp4";
        }

        EditText titulo_enviar = findViewById(R.id.titulo_enviar);
        final String titulo = titulo_enviar.getText().toString();
        if (TextUtils.isEmpty(titulo)) {
            titulo_enviar.setError(getString(R.string.erro_titulo_vazio));
            dialogoLoading.dismiss();
            return;
        } else {
            titulo_enviar.setError(null);
        }

        final String idEnvio = UUID.randomUUID().toString();
       // final String idUsuario = usuarioAtual.getUid();
        final String urlImagem = variaveisGlobais.urlMidiaFirebase + idEnvio + extensaoArquivo + "?alt=media";
        longitude = longitudeDouble.toString();
        latitude = latitudeDouble.toString();
        final long agora = System.currentTimeMillis();

        if (codigoRequest == ESCOLHER_IMAGEM_REQUESTCODE && codigoResultado == RESULT_OK) {
            final StorageReference sr = referenceStorage.child("midia/" + idEnvio + extensaoArquivo);
            sr.putFile(arquivoLocalImagem).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                    new Thread(new Runnable() {
                        public void run() {
                            try {
                                Document d = Jsoup.connect(variaveisGlobais.urlApiGravar)
                                        .data("titulo", titulo)
                                        .data("latitude", latitude)
                                        .data("longitude", longitude)
                                        .data("imagem", urlImagem)
                                        .data("idUsuario", sharp.getString("uid", ""))
                                        .data("idEnvio", idEnvio)
                                        .data("nome_pessoa", sharp.getString("nome", ""))
                                        .data("tempo", Long.toString(agora))
                                        .post();
                                finalizar();
                            } catch (Exception e) {
                                //
                            }
                        }
                    }).start();
                    dialogoLoading.dismiss();
                    TastyToast.makeText(getApplicationContext(), getString(R.string.envio_concluido), Toast.LENGTH_SHORT, TastyToast.SUCCESS);
                }
            });
        }
    }

    // método abaixo para reabrir o aplicativo, sendo assim um jeito simplificado (gambiarra, praticamente) para voltar à activity inicial, a do mapa;
    private void finalizar() {
        Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(i);
        System.exit(0);
    }

    private void erroLocalizacaoNula() {
        if (latitude.equals("0.0") || longitude.equals("0.0")) {
            Context c = this;
            AlertDialog.Builder b = new AlertDialog.Builder(c);
            b.setTitle(R.string.nao_possivel_detectar_localizacao_titulo);
            b.setMessage(R.string.nao_possivel_detectar_localizacao_descricao);
            b.setCancelable(true);
            b.setIcon(R.drawable.icone_gps_desligado);
            b.setPositiveButton(
                    R.string.configuracoes_ir,
                    new DialogInterface.OnClickListener() {
                        public void onClick(final DialogInterface d, int id) {
                            startActivityForResult(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS), 0);
                            d.cancel();
                        }
                    });
            b.setNegativeButton(
                    R.string.ok,
                    new DialogInterface.OnClickListener() {
                        public void onClick(final DialogInterface d, int id) {
                            dialogoLoading.dismiss();
                            d.cancel();
                        }
                    });
            AlertDialog alerta = b.create();
            alerta.show();
            dialogoLoading.dismiss();
            return;
        }
    }
    @Override
    public void onResume() {
        super.onResume();
        localizacao.beginUpdates();
    }
    @Override
    public void onPause() {
        localizacao.endUpdates();
        super.onPause();
    }
    @Override
    public void onStop() {
        localizacao.endUpdates();
        super.onStop();
    }
    @Override
    public void onDestroy() {
        localizacao.endUpdates();
        super.onDestroy();
    }

}